package edu.software.PBL_Management_System.controller;

import edu.software.PBL_Management_System.dto.ChatRequest;
import edu.software.PBL_Management_System.service.DifyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

/**
 * 聊天控制器
 * 负责处理前端发送的聊天请求，支持普通模式和流式模式
 */
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "*") // 允许跨域请求，生产环境建议配置具体域名
public class ChatController {

    @Autowired
    private DifyService difyService; // 注入Dify服务

    /**
     * 普通聊天接口（阻塞模式）
     * 接收前端消息，转发给Dify，等待完整响应后返回
     *
     * @param request 聊天请求，包含用户消息、会话ID等信息
     * @return ResponseEntity<String> 完整的聊天响应
     */
    @PostMapping("/chat")
    public ResponseEntity<String> chat(@RequestBody ChatRequest request) {
        try {
            System.out.println("收到普通聊天请求 - 用户: " + request.getUser() + ", 消息: " + request.getQuery());

            // 调用Dify服务发送消息
            String response = difyService.sendMessage(request);

            System.out.println("普通聊天响应发送完成");
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            System.err.println("普通聊天处理错误: " + e.getMessage());
            e.printStackTrace(); // 打印完整错误堆栈
            return ResponseEntity.internalServerError()
                    .body("聊天服务异常: " + e.getMessage());
        }
    }

    /**
     * 流式聊天接口
     * 接收前端消息，转发给Dify，实时流式返回响应数据
     * 使用Server-Sent Events (SSE) 技术实现实时推送
     *
     * @param request 聊天请求，包含用户消息、会话ID等信息
     * @return Flux<String> 流式响应数据流
     */
    @PostMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> chatStream(@RequestBody ChatRequest request) {
        System.out.println("收到流式聊天请求 - 用户: " + request.getUser() + ", 消息: " + request.getQuery());

        // 返回流式响应，每个数据块都会实时推送给前端
        return difyService.sendMessageStream(request)
                .doOnComplete(() -> System.out.println("流式聊天响应发送完成"))
                .doOnError(error -> System.err.println("流式聊天处理错误: " + error.getMessage()));
    }
}